#pragma once
#include "inline_array.h"

using namespace System;

namespace CoreCalc {

	template<typename T, int n>
	public ref class VecBase
	{
	public:

		inline_array<T, n>^ data;

		VecBase()
		{
		}
		static bool    operator ==(const VecBase^, const VecBase^);
		static VecBase^ operator /(const VecBase^, double);
		static VecBase^ operator +(const VecBase^, const VecBase^);
		static VecBase^ operator -(const VecBase^, const VecBase^);

	};


	template<typename T>
	public ref class Vec3Base
	{
	public:

		T x, y, z;

		Vec3Base()
		{
			x = y = z = 0;
		};

		Vec3Base(const T a)
		{
			x = y = z = a;
		};

		Vec3Base(const T a, const T b, const T c) : x(a), y(b), z(c)
		{
		};

		Vec3Base(const Vec3Base^ c) 
		{
			x = c->x;
			y = c->y;
			z = c->z;
		}

		static bool operator ==(const Vec3Base^ a, const Vec3Base^ b) 
		{

		};

		static Vec3Base^ operator /(const Vec3Base^ a, T b) 
		{
			return gcnew Vec3Base(a->x / b, a->y / b, a->z / b);			
		};

		static Vec3Base^ operator +(const Vec3Base^ a, const Vec3Base^ b) 
		{
			return gcnew Vec3Base(a->x + b->x, 
								  a->y + b->y,
								  a->z + b->z);
		};
		static Vec3Base^ operator -(const Vec3Base^ a, const Vec3Base^ b) 
		{
			return gcnew Vec3Base(a->x - b->x,
								  a->y - b->y,
								  a->z - b->z);
		};
	};


	public ref class Vec3i// : public Vec3Base<int>
	{

	};

	public ref class Vec3f : public Vec3Base<float>
	{

	};

	public ref class VecHelper
	{

	};


}